﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>

//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	//比较日期相等
//	bool operator==(const Date& x2)
//	{
//		return _year == x2._year && _month == x2._month && _day == x2._day;
//	}
//
//	//日期的比较大小
//	bool operator<(const Date& x2)
//	{
//		if (_year < x2._year)//年小
//		{
//			return true;
//		}
//		else if (_year == x2._year && _month < x2._month)
//		{//年相等，月小
//			return true;
//		}
//		else if (_year == x2._year && _month == x2._month && _day < x2._day)
//		{//年和月都相等，天小
//			return true;
//		}
//
//		return false;
//	}
//
//	//日期-日期，计算之间有多少天
//	//int operator-(const Date& x2);
//
//	//获取每个月的天数
//	int GetMonthDay(int year, int month)
//	{
//		//闰年二月是29天，平年28天
//		assert(month > 0 && month < 13);
//		static int monthDay[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30 };
//		//                                       0   1    2    3    4   5    6    7    8    9  10  11  12
//		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
//		{
//			return 29;
//		}
//
//		return monthDay[month];
//	}
//
//	//日期+天数
//	//Date operator+(int day)
//	//{
//	//	static Date d1;
//	//	//1.全部加到天数上
//	//	d1._day = _day + day;
//	//	//2.判断是否超出了当月的天数，如果超出了，就进位
//	//	if (d1._day > GetMonthDay(_year, _month))
//	//	{
//	//		d1._day -= GetMonthDay(_year, _month);
//	//		_month++;
//	//	}
//	//	//否则就赋值返回
//	//	d1._year = _year;
//	//	d1._month = _month;
//	//	return d1;
//	//}
//
//	Date operator+=(int day)
//	{
//
//	}
//
//	//前置++重载
//	Date& operator++()
//	{
//		*this += 1;
//		return *this;//返回++后的值
//	}
//
//	//后置++重载
//	Date operator++(int i)
//	{
//		Date tmp(*this);//拷贝构造
//		*this += 1;
//		return tmp;//返回++前的值
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(2024, 8, 9);
//	Date d2(2024, 8, 10);
//
//	//调用运算符重载成员函数
//	bool ret1 = d1.operator<(d2);//显示调用
//	bool ret2 = d1 < d2;
//
//	std::cout << ret1 << std::endl;
//	std::cout << ret2 << std::endl;
//
//	//int n = d1 - d2;//日期相减=天数
//	//日期+天数
//	//Date d3 = d1 + 50;
//
//	//前置++后置++重载
//	++d1;
//	//d1.operator++()
//
//	d1++;
//	//d1.operator++(1)
//
//	return 0;
//}

//回调成员函数指针
//class A
//{
//public:
//	void func()//成员函数有一个隐含的this指针
//	{
//		std::cout << "A::func()" << std::endl;
//	}
//};
//
//typedef void(A::* PF)();
//
//int main()
//{
//	//void (A::*pf)();//函数指针
//	//pf = &A::func;
//	PF pf = &A::func;
//	A obj;
//	//对象调用成员函数指针时，使用.*运算符
//	(obj.*pf)();
//
//	return 0;
//}

//重载操作符⾄少有⼀个类类型参数
//int operator+(int x, int y)
//{
//	return x - y;
//}

//赋值运算符重载
//class Date
//{
//public :
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	//编译器会自动生成一个默认赋值运算符重载,
//	// 对内置类型成员变量会完成值拷贝/浅拷贝
//	
//	//d1 = d2 = d3;//连续赋值
//	/*Date& operator=(const Date& d)
//	{
//		if (this != &d)
//		{
//			_year = d._year;
//			_month = d._month;
//			_day = d._day;
//		}
//		
//		return *this;
//	}*/
//
//	void Print()
//	{
//		std::cout << _year << "-" << _month << "-" << _day << std::endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(2024, 8, 10);
//	
//	//拷贝构造，用于一个已经存在的对象拷贝初始化给另一个要创建的对象
//	Date d2(d1);
//	Date d4 = d1;
//
//	//赋值拷贝，两个已经存在的对象直接的拷贝赋值
//	Date d3(2024, 9, 11);
//	//d1 = d3;//d1.operator=(d3)
//
//	d1 = d2 = d3;
//
//	//连续赋值
//	int i, j, k;
//	i = j = k = 1;
//
//	return 0;
//}


